home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / ae / code / ax3.00 / paraport.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-03  |  43.6 KB  |  1,296 lines

  1. /*********************************************
  2.   SPAZ, I CHANGED A LOT OF THIS CODE
  3.   PLEASE CHECK IT OUT, THERE WAS SO MANY
  4.   CHANGES, MY NAME WOULD HAVE BEEN ALL OVER
  5.   IT.
  6.  *********************************************/
  7. #include "bbs.h"
  8. #include <clib/intuition_protos.h>
  9. #define SEEK_SET 0
  10. #define FOREVER for(;;)
  11. #define NL NULL
  12. #define JH_LI 0
  13. #define JH_REGISTER 1
  14. #define JH_SHUTDOWN 2
  15. #define JH_WRITE 3
  16. #define JH_SM 4
  17. #define JH_PM 5
  18. #define JH_HK 6
  19. #define JH_SG 7
  20. #define JH_SF 8
  21. #define JH_EF 9
  22. #define JH_CO 10
  23. #define JH_BBSName 11
  24. #define JH_Sysop 12
  25. #define JH_FLAGFILE 13
  26. #define JH_SHOWFLAGS 14
  27. #define JH_DL 15
  28. #define JH_ExtHK 15
  29. #define JH_SIGBIT 16
  30. #define JH_FetchKey 17
  31. #define JH_SO 18
  32. /**************************** GET/SET Values from System ***********************/
  33.  
  34. #define DT_NAME           100
  35. #define DT_PASSWORD       101
  36. #define DT_LOCATION       102
  37. #define DT_PHONENUMBER    103
  38. #define DT_SLOTNUMBER     104
  39. #define DT_SECSTATUS      105
  40. #define DT_SECBOARD       106
  41. #define DT_SECLIBRARY     107
  42. #define DT_SECBULLETIN    108
  43. #define DT_MESSAGESPOSTED 109
  44. #define DT_UPLOADS        110
  45. #define DT_DOWNLOADS      111
  46. #define DT_TIMESCALLED    112
  47. #define DT_TIMELASTON     113
  48. #define DT_TIMEUSED       114
  49. #define DT_TIMELIMIT      115
  50. #define DT_TIMETOTAL      116
  51. #define DT_BYTESUPLOAD    117
  52. #define DT_BYTEDOWNLOAD   118
  53. #define DT_DAILYBYTELIMIT 119
  54. #define DT_DAILYBYTEDLD   120
  55. #define DT_EXPERT         121
  56. #define DT_LINELENGTH     122
  57. #define ACTIVE_NODES      123
  58. #define DT_DUMP           124
  59. #define DT_TIMEOUT        125
  60. #define BB_CONFNAME       126
  61. #define BB_CONFLOCAL      127
  62. #define BB_LOCAL          128
  63. #define BB_STATUS         129
  64. #define BB_COMMAND        130
  65. #define BB_MAINLINE       131
  66. #define NB_LOAD           132
  67. #define DT_USERLOAD       133
  68. #define BB_CONFIG         134
  69. #define CHG_USER          135
  70. #define RETURNCOMMAND     136
  71. #define ZMODEMSEND        137
  72. #define ZMODEMRECEIVE     138
  73. #define SCREEN_ADDRESS    139
  74. #define BB_TASKPRI        140
  75. #define RAWSCREEN_ADDRESS 141
  76. #define BB_CHATFLAG       142
  77. #define DT_STAMP_LASTON   143
  78. #define DT_STAMP_CTIME    144
  79. #define DT_CURR_TIME      145
  80. #define DT_CONFACCESS     146
  81. #define BB_PCONFLOCAL     147
  82. #define BB_PCONFNAME      148
  83. #define BB_NODEID         149
  84. #define BB_CALLERSLOG     150
  85. #define BB_UDLOG          151
  86. #define EXPRESS_VERSION   152
  87. #define SV_UNICONIFY      153
  88. #define BB_CHATSET        162
  89. #define ENVSTAT           163
  90. #define GETKEY            500
  91. #define RAWARROW          501
  92. #define CHAIN             502
  93. /****************** in progress ******************/
  94. #define NODE_DEVICE       503
  95. #define NODE_UNIT         504
  96. #define NODE_BAUD         505
  97. #define NODE_NUMBER       506
  98. #define JH_MCI            507
  99. /*************************************************/
  100. #define PRV_COMMAND       508
  101. #define PRV_GROUP         509
  102. #define BB_CONFNUM        510
  103. #define BB_DROPDTR        511
  104. #define BB_GETTASK        512
  105. #define BB_REMOVEPORT     513
  106. #define BB_SOPT           514
  107. #define NODE_BAUDRATE     516
  108. #define BB_LOGONTYPE      517
  109. #define BB_SCRLEFT        518
  110. #define BB_SCRTOP         519
  111. #define BB_SCRWIDTH       520
  112. #define BB_SCRHEIGHT      521
  113. #define BB_PURGELINE      522
  114. #define BB_PURGELINESTART 523
  115. #define BB_PURGELINEEND   524
  116. #define BB_NONSTOPTEXT    525
  117. #define BB_LINECOUNT      526
  118. #define DT_LANGUAGE       527
  119. #define DT_QUICKFLAG      528
  120. #define DT_GOODFILE       529
  121. #define DT_ANSICOLOR      530
  122. #define MULTICOM          531
  123. #define LOAD_ACCOUNT      532
  124. #define SAVE_ACCOUNT      533
  125. #define SAVE_CONFDB       534
  126. #define LOAD_CONFDB       535
  127. #define GET_CONFNUM       536
  128. #define SEARCH_ACCOUNT    537
  129. #define APPEND_ACCOUNT    538
  130. #define LAST_ACCOUNTNUM   539
  131. #define MOD_TYPE          540
  132. #define DT_ISANSI         541
  133. #define BATCHZMODEMSEND   542
  134. #define DT_MSGCODE        543
  135. #define ACP_COMMAND       544
  136. #define DT_FILECODE       545
  137. #define EDITOR_STRUCT     546
  138. #define BYPASS_CSI_CHECK  547
  139. #define SENTBY            548
  140. #define DT_ADDBIT         1000
  141. #define DT_REMBIT         1001
  142. #define DT_QUERYBIT       1002
  143.  
  144. #define READIT 1
  145. #define WRITEIT 0
  146. #define HK HtKey
  147. #define PM prompt
  148. #define SG showgfile
  149. #define SF showfile
  150. #define EF EditFile
  151. #define DROP Drop
  152. #define EDITSAVE 1
  153. #define EDITABORT 2
  154. #define EDITEDIT 3
  155. #define EDITLIST 4
  156. #define ANYKEY "press <RETURN> to continue"
  157. /**************************** PARAGON DEFINES ****************************/
  158. #define PG_SHUTDOWN 20
  159. #define PG_CO 2
  160. #define PG_SM 1
  161. #define PG_SO 3
  162. #define PG_CC 4
  163. #define PG_CH 5
  164. #define PG_PM 6
  165. #define PG_HK 8
  166. #define PG_SG 19
  167. #define PG_SF 10
  168. #define PG_EF 12
  169. #define PG_UD 13
  170. #define PG_US 14
  171. #define PG_PS 15
  172. #define PG_CS 16
  173. #define PG_RD 17
  174. #define PG_CL 18
  175. #define PG_TM 21
  176. #define PG_SC 7
  177. #define PG_FF 11
  178. extern int doormsgcode;
  179. extern char ReservedName[];
  180. extern int ReadExtChar(unsigned long wait,unsigned long signal);
  181. int Dropped=0;
  182. extern char *MyVerStr;
  183. LONG DOOR_TIMEOUT = KEYBOARD_TIMEOUT;
  184. extern int Edit(void);
  185. extern char ServerCommand[];
  186. BOOL isparagon = FALSE;
  187. char Screen_Address[200];
  188. int UserIsDoing=-1;
  189. int DoorResult;
  190. extern int AEGoodFile;
  191. extern char lang[];
  192. extern char MsgBuf[100][80];
  193. extern int XIMPort;
  194. unsigned long doorextsig=0L;
  195. extern int checksym;
  196. extern int BypassCSI;
  197.  
  198. struct MyEditor
  199. {
  200.   SHORT MaxFileLength;
  201.   UBYTE MaxScrLength;
  202.   UBYTE EditorTop;
  203.   UBYTE EditorMaxWidth;
  204.   UBYTE EditorAnsiColor;
  205.   UBYTE EditorAllowLoad;
  206.   UBYTE EditorAllowAbort;
  207.   CPTR  EditorFile;
  208.   CPTR  EditorIncludeFile;
  209.   CPTR  EditorPrependFile;
  210.   CPTR  EditorPostPendFile;
  211. } EditorStruct;
  212.  
  213. struct JHMessage
  214. {
  215.   struct Message Msg;
  216.   char String[200];
  217.   int Data;
  218.   int Command;
  219.   int NodeID;
  220.   int LineNum;
  221.   unsigned long signal;
  222.   struct Process *task;
  223.   APTR *Semi;
  224.   APTR Filler1;
  225.   APTR Filler2;
  226.  
  227. } ;
  228.  
  229. struct JHMessage *servermsg;
  230. struct DoorMsg {
  231.     struct Message Door_Msg;
  232.     short command;
  233.     short data;
  234.     char string[80];
  235.     short carrier;
  236.     };
  237.  
  238. struct DoorMsg *doormsg;
  239. struct MsgPort *resmp;
  240. char ResPortName[30];
  241. ULONG ResControl(int node)
  242. {
  243.   sprintf(ResPortName,"AEServer.%d",node);
  244.   resmp=CreatePort(ResPortName,0L);
  245.   return((ULONG)(1L<< resmp->mp_SigBit));
  246. }
  247. void DeleteResControl(void)
  248. {
  249.   if(resmp)
  250.               DeletePort((struct MsgPort *)resmp); resmp=0L;
  251. }
  252. void FreeACP(struct JHMessage *servermsg);
  253. BOOL CheckDoorMsg(int Mode)
  254. {
  255.    static BOOL Inac=FALSE;
  256.    register BOOL returnval=FALSE;
  257.    int ch;
  258.    if(Inac) return(0);
  259.    while(servermsg=(struct JHMessage *)GetMsg((struct MsgPort *)resmp))
  260.   {
  261.     
  262.     switch(servermsg->Command)
  263.     {
  264.        case JH_WRITE:
  265.             Inac=TRUE;
  266.             if(UserIsDoing==0)
  267.             { 
  268.             AEPutStr(servermsg->String);} servermsg->Command=UserIsDoing; 
  269.             Inac=FALSE; break;
  270.        case JH_MCI:
  271.             Inac=TRUE; MCIDoor=TRUE;
  272.             ReplyMsg((struct Message *)servermsg);
  273.             mciputstr(servermsg->String); MCIDoor=FALSE;if(servermsg->Data) AEPutStr("\r\n");
  274.             Inac=FALSE; return(returnval);break;
  275.        case  JH_CO:
  276.              Inac=TRUE;
  277.              ConPutStr(servermsg->String); if(servermsg->Data) ConPutStr("\r\n"); 
  278.              Inac=FALSE;break;
  279.        case  JH_SM:
  280.              Inac=TRUE;
  281.              AEPutStr(servermsg->String);if(servermsg->Data) AEPutStr("\r\n");
  282.              Inac=FALSE; break;
  283.        case  JH_PM:
  284.              Inac=TRUE; AEPutStr(servermsg->String);
  285.              if(LineInput("",servermsg->String,servermsg->Data,DOOR_TIMEOUT)<0)
  286.              servermsg->Data=-1; else servermsg->Data=1; Inac=FALSE;break;
  287.        case  JH_HK:
  288.              Inac=TRUE;
  289.              ch=HtKey(servermsg->String);  if(ch<0)servermsg->Data=-1;else servermsg->Data=1;
  290.              servermsg->String[0]=ch; servermsg->String[1]='\0';Inac=FALSE; break;
  291.        case  JH_SG:
  292.              Inac=TRUE;gnsflag=0;
  293.              SG(servermsg->String); Inac=FALSE;break;
  294.        case  JH_SF: Inac=TRUE;gnsflag=0;
  295.              SF(servermsg->String); Inac=FALSE;break;
  296.        case  JH_EF: Inac=TRUE;
  297.              EF(servermsg->String,servermsg->Data,1000); Inac=FALSE;break;
  298.        case  JH_BBSName:
  299.              strcpy(servermsg->String,Cmds->BBSName); break;
  300.        case  JH_Sysop:
  301.              strcpy(servermsg->String,Cmds->SysopName); break;
  302.        case  JH_FLAGFILE:
  303.              AddFlagtoList(servermsg->String); break;
  304.        case  DT_NAME          :
  305.              if(servermsg->Data) strcpy(servermsg->String,User.Name);
  306.              else sprintf(User.Name,"%.31s",servermsg->String);
  307.              break;
  308.  
  309.        case  DT_PASSWORD      :
  310.  
  311.         if(servermsg->Data)
  312.             {
  313.             /* get user password */
  314.             strcpy(servermsg->String,"ENCRYPTED");
  315.  
  316.             } else {
  317.  
  318.             /* set user password */
  319.             AECryptCpy(User.PassKey,servermsg->String);
  320.             }
  321.              break;
  322.  
  323.        case  DT_LOCATION      :
  324.              if(servermsg->Data) strcpy(servermsg->String,User.Location);
  325.              else sprintf(User.Location,"%.30s",servermsg->String);
  326.              break;
  327.        case  DT_PHONENUMBER   :
  328.              if(servermsg->Data) strcpy(servermsg->String,User.PhoneNumber);
  329.              else sprintf(User.PhoneNumber,"%.13s",servermsg->String);
  330.              break;
  331.        case  DT_SLOTNUMBER    :
  332.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Slot_Number);
  333.              else User.Slot_Number=atoi(servermsg->String);
  334.              break;
  335.        case  DT_SECSTATUS     :
  336.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Sec_Status);
  337.              else { User.Sec_Status=atoi(servermsg->String); ConvertAccess(); }
  338.              break;
  339.        case  DT_SECBOARD      :
  340.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Sec_Board);
  341.              else User.Sec_Board=atoi(servermsg->String);
  342.              break;
  343.        case  DT_SECLIBRARY    :
  344.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Sec_Library);
  345.              else User.Sec_Library=atoi(servermsg->String);
  346.              break;
  347.        case  DT_SECBULLETIN   :
  348.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Sec_Bulletin);
  349.              else User.Sec_Bulletin=atoi(servermsg->String);
  350.              break;
  351.        case  DT_MESSAGESPOSTED:
  352.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Messages_Posted);
  353.              else User.Messages_Posted=atoi(servermsg->String);
  354.              break;
  355.        case  DT_UPLOADS       :
  356.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Uploads);
  357.              else User.Uploads=atoi(servermsg->String);
  358.              break;
  359.        case  DT_DOWNLOADS     :
  360.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Downloads);
  361.              else User.Downloads=atoi(servermsg->String);
  362.              break;
  363.        case  DT_TIMESCALLED   :
  364.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Times_Called);
  365.              else User.Times_Called=atoi(servermsg->String);
  366.              break;
  367.        case  DT_TIMELASTON    :
  368.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Time_Last_On);
  369.              else User.Time_Last_On=atol(servermsg->String);
  370.              break;
  371.        case  DT_TIMEUSED      :
  372.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Time_Used);
  373.              else User.Time_Used=atol(servermsg->String);
  374.              break;
  375.        case  DT_TIMELIMIT     :
  376.              if(servermsg->Data) sprintf(servermsg->String,"%d",Time_limit);
  377.              else Time_limit=atol(servermsg->String);
  378.              break;
  379.        case  DT_TIMETOTAL     :
  380.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Time_Total);
  381.              else User.Time_Total=atol(servermsg->String);
  382.              break;
  383.        case  DT_BYTESUPLOAD   :
  384.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Bytes_Upload);
  385.              else User.Bytes_Upload=atol(servermsg->String);
  386.              break;
  387.        case  DT_BYTEDOWNLOAD  :
  388.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Bytes_Download);
  389.              else User.Bytes_Download=atol(servermsg->String);
  390.              break;
  391.        case  DT_DAILYBYTELIMIT:
  392.              if(servermsg->Data) sprintf(servermsg->String,"%d",BytesADL);
  393.              else BytesADL=atol(servermsg->String);
  394.              break;
  395.        case  DT_DAILYBYTEDLD  :
  396.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.Daily_Bytes_Dld);
  397.              else User.Daily_Bytes_Dld=atol(servermsg->String);
  398.              break;
  399.        case  DT_EXPERT        :
  400.              if(servermsg->Data) sprintf(servermsg->String,"%c",User.Expert);
  401.              else User.Expert=servermsg->String[0];
  402.              break;
  403.        case  DT_LINELENGTH    :
  404.              if(servermsg->Data) sprintf(servermsg->String,"%d",User.LineLength);
  405.              else User.LineLength=atoi(servermsg->String);
  406.              break;
  407.       case  DT_DUMP: 
  408.             DumpActiveUser(servermsg->String); break;
  409.       case  DT_TIMEOUT:
  410.             if(servermsg->Data) sprintf(servermsg->String,"%d",DOOR_TIMEOUT);
  411.             else DOOR_TIMEOUT=atol(servermsg->String);
  412.             break;
  413.       case  BB_CONFNAME:
  414.             if(servermsg->Data) strcpy(servermsg->String,Conference_Name);
  415.             else{ strcpy(Conference_Name,servermsg->String);
  416.                   strcpy(Cmds->ConfName[User.ConfRJoin-1],servermsg->String); 
  417.                 }
  418.             break;
  419.       case  BB_CONFLOCAL:
  420.             if(servermsg->Data) strcpy(servermsg->String,Conference_Location);
  421.             else strcpy(Conference_Location,servermsg->String);
  422.             break;  
  423.       case  BB_LOCAL:
  424.             strcpy(servermsg->String,Cmds->BBSLoc); break;
  425.       case  BB_STATUS:
  426.             if(Mode) strcpy(servermsg->String,"ONLINE"); else
  427.             strcpy(servermsg->String,"OFFLINE"); break;
  428.       case  BB_COMMAND:
  429.             serverin[0]=servermsg->String[0]; serverin[1]='\0'; returnval=TRUE; break;
  430.       case  BB_MAINLINE:
  431.             ServerCommand[195]='\0';
  432.             strcpy(servermsg->String,ServerCommand); break;
  433.       case  BB_TASKPRI:
  434.             sprintf(Screen_Address,"%u",Cmds->TaskPri);
  435.             strcpy(servermsg->String,Screen_Address);
  436.             break;
  437.       case  BB_CHATFLAG:
  438.             if(SySChat) strcpy(servermsg->String,"ON");
  439.             else strcpy(servermsg->String,"OFF");
  440.             break;
  441.       case  RAWSCREEN_ADDRESS:
  442.             sprintf(Screen_Address,"%ld",MYScreen);
  443.             strcpy(servermsg->String,Screen_Address);
  444.             break; 
  445.       case  BB_CHATSET:
  446.             if(servermsg->Data)
  447.             {
  448.               sprintf(Screen_Address,"%d",PagedFlag);
  449.               strcpy(servermsg->String,Screen_Address);
  450.             }else PagedFlag=atoi(servermsg->String);
  451.             break;
  452.       case  EXPRESS_VERSION:
  453.             strcpy(servermsg->String,MyVerStr);
  454.             break;
  455.       case  SV_UNICONIFY: 
  456.              ReplyMsg((struct Message *)servermsg); FreeMem(servermsg,servermsg->Msg.mn_Length);
  457.             if(ICON)UnIconifyAE(0); else ScreenToFront(MYScreen);
  458.             continue;break;
  459.     
  460.       case  SV_SYSOPLOG: FreeACP(servermsg);
  461.             Server(SV_SYSOPLOG); continue;break;
  462.       case  SV_LOCALLOG: FreeACP(servermsg);
  463.             Server(SV_LOCALLOG); continue;break;
  464.       case  SV_ACCOUNTS: FreeACP(servermsg);
  465.             Server(SV_ACCOUNTS);continue;break;
  466.       case  SV_EXITNODE:
  467.             ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
  468.             Server(SV_EXITNODE); continue;break;
  469.       case  SV_INITMODEM:
  470.             ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
  471.             Server(SV_INITMODEM); continue; break;
  472.       case  SV_NODEOFFHOOK:
  473.             ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
  474.             Server(SV_NODEOFFHOOK); continue;break;
  475.       case  SV_WHATSUP:
  476.             ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
  477.             SendMaster(); continue; break;
  478.       case  SV_INSTANT: FreeACP(servermsg);
  479.             Server(SV_INSTANT); continue; break;
  480.       case  SV_RESERVE: FreeACP(servermsg);
  481.             Server(SV_RESERVE); continue; break;
  482.       case  SV_CHATTOGGLE:
  483.             ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
  484.             Server(SV_CHATTOGGLE); /*StatChatFlag();*/continue; break;
  485.       case  SV_AESHELL: FreeACP(servermsg);
  486.             Server(SV_AESHELL); continue; break;
  487.       case   SV_CHAT: FreeACP(servermsg);
  488.             Server(SV_CHAT); returnval=TRUE; continue;break;
  489.       case  SV_SETNRAMS: ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
  490.             SetNRAMS(); continue; break;
  491.  
  492.       case  SV_QUIETNODE: ReplyMsg((struct Message *)servermsg);FreeMem(servermsg,servermsg->Msg.mn_Length);
  493.             Server(SV_QUIETNODE); continue; break;
  494.       case  SV_RESERVENODE: ReplyMsg((struct Message *)servermsg);
  495.             strcpy(ReservedName,servermsg->String);
  496.             FreeMem(servermsg,servermsg->Msg.mn_Length);
  497.             if(ReservedName[0]=='\0') SetEnvStat(ENV_AWAITCONNECT); else
  498.             SetEnvStat(ENV_RESERVE);
  499.             break;
  500.      }  
  501.     ReplyMsg((struct Message *)servermsg);
  502.   }
  503.   return(returnval);
  504. }
  505.  
  506. void FreeACP(struct JHMessage *servermsg)
  507. {
  508.  ReplyMsg((struct Message *)servermsg); FreeMem(servermsg,servermsg->Msg.mn_Length);
  509.             if(ICON)UnIconifyAE(1); else ScreenToFront(MYScreen);
  510. }
  511. int Control(int node,int Type,int ModType)
  512. {
  513.   struct MsgPort *mp;
  514.   struct JHMessage *msg;
  515.   struct User *tempuserdata;
  516.   struct UserKeys *tempuserkeys;
  517.   struct ConfBase *tempconfdb;
  518.   //char *JhExtPort;
  519.   long XtypeSig;
  520.   long TimeVar;
  521.   long signals;
  522.   int Nodes=0;
  523.   int DoorActive=0;
  524.   int temp;
  525.   int ch;
  526.   int i;
  527.   char date[20];
  528.   char DISPLAY_time[30];
  529.   char string[200];
  530.   char TEMPMENU_Li[200];
  531.   if(strlen(MAINMENU_Li)>199) MAINMENU_Li[198]='\0';
  532.   strcpy(TEMPMENU_Li,MAINMENU_Li);
  533.   strcpy(MAINMENU_Li,"");
  534.   //LineCount = 0;
  535.   if(Type=='I') return(0);
  536.  
  537.   if(Type=='X')
  538.   {   
  539.     sprintf(GSTR1,"AEDoorPort%d\0",node);
  540.     if(mp=FindPort(GSTR1))
  541.             {
  542.             DoorActive=1;
  543.             } else {
  544.             mp=CreatePort(GSTR1,0L);
  545.             }
  546.  
  547.   isparagon=FALSE;
  548.   XtypeSig=(1L<< mp->mp_SigBit);
  549.   }    
  550.   else
  551.   {
  552.     sprintf(GSTR1,"DoorControl%d\0",node);
  553.     if(FindPort(GSTR1)) return(0);
  554.     mp=CreatePort(GSTR1,0L);
  555.    
  556.   isparagon=TRUE;
  557.   } 
  558.  
  559.  
  560. if(Type=='X')   
  561. while(1)
  562. {
  563.   signals=Wait(XtypeSig | DoorSig);
  564.   if(signals&DoorSig) { CheckDoorMsg(0); continue; }
  565.   while(msg=(struct JHMessage *)GetMsg((struct MsgPort *)mp))
  566.   {
  567.     if(msg->Command!=ACP_COMMAND)msg->LineNum=0;
  568.     switch(msg->Command)
  569.     {
  570.        case JH_REGISTER:
  571.             Nodes++;  
  572.             break;
  573.        case JH_WRITE:
  574.             AEPutStr(msg->String); break;
  575.        case CHAIN:
  576.             Nodes--; break;
  577.        case JH_SHUTDOWN:
  578.              Nodes--;
  579.              
  580.              if(!Nodes)
  581.              {
  582.                 RawArrow=0;
  583.                 ReplyMsg((struct Message *)msg);
  584.                 if(!DoorActive)DeletePort((struct MsgPort *)mp);
  585.                 if(MAINMENU_Li[0]!='\0') return(1); else return(0);
  586.              }
  587.              break;
  588.        case  JH_SIGBIT:
  589.              msg->Data=doorextsig;
  590.              break;
  591.        case  RETURNCOMMAND:
  592.              strcpy(MAINMENU_Li,msg->String);
  593.              strcpy(ServerCommand,msg->String); break;
  594.        case  JH_CO:
  595.              ConPutStr(msg->String); if(msg->Data){ ConPutStr("\r\n"); CheckForPause();} break;
  596.        case  JH_SO:
  597.              SerPutStr(msg->String); if(msg->Data){ SerPutStr("\r\n");} break;
  598.        case  JH_SM:
  599.              AEPutStr(msg->String);if(msg->Data)
  600.              { AEPutStr("\r\n"); CheckForPause();}  break;
  601.        case  JH_MCI: MCIDoor=TRUE;
  602.              strcpy(Screen_Address,msg->String);
  603.              mciputstr(Screen_Address);MCIDoor=FALSE; if(msg->Data)
  604.              { AEPutStr("\r\n"); CheckForPause();} break;
  605.        case  JH_PM: AEPutStr(msg->String);
  606.              if(LineInput("",msg->String,msg->Data,DOOR_TIMEOUT)<0)
  607.              msg->Data=-1; else msg->Data=1; break;
  608.        case  JH_LI:
  609.              if(LineInput(msg->String,msg->String,msg->Data,DOOR_TIMEOUT)<0)
  610.              msg->Data=-1; else msg->Data=1; break;
  611.        case  JH_ExtHK: LineCount=0;
  612.              msg->Command=ReadExtChar(DOOR_TIMEOUT,1L << (msg->signal));
  613.              if(msg->Command<0)msg->Data=-1;else msg->Data=1;
  614.              break;
  615.        case  JH_HK: LineCount=0;
  616.              ch=HtKey(msg->String);  if(ch<0)msg->Data=-1;else msg->Data=1;
  617.              msg->String[0]=ch; msg->String[1]='\0'; msg->Command=XIMPort;break;
  618.        case  JH_FetchKey:
  619.              if(CheckCon() || CheckSer())
  620.              {
  621.  
  622.              msg->Command=ReadChar(DOOR_TIMEOUT);  if(msg->Command<0)msg->Data=-1;else msg->Data=1;
  623.              }
  624.              else { msg->Command=0; msg->Data=1; } break; 
  625.        case  JH_SG:gnsflag=0;
  626.              ChecktoDisplay(msg->String,Screen_Address,1,0); break;
  627.        case  JH_SF:gnsflag=0;
  628.              SF(msg->String); break;
  629.        case  JH_EF:
  630.              if(!EF(msg->String,msg->Data,1000)) msg->Data=-1; else msg->Data=1;break;
  631.        case  JH_BBSName:
  632.              strcpy(msg->String,Cmds->BBSName); break;
  633.        case  JH_Sysop:
  634.              strcpy(msg->String,Cmds->SysopName); break;
  635.        case  JH_FLAGFILE:
  636.              AddFlagtoList(msg->String); break;
  637.        case  DT_NAME          :
  638.              if(msg->Data) strcpy(msg->String,User.Name);
  639.              else sprintf(User.Name,"%.31s",msg->String);
  640.              break;
  641.  
  642.        case  DT_PASSWORD      :
  643.                  if(msg->Data)
  644.             {
  645.             /* get user password */
  646.             strcpy(msg->String,"ENCRYPTED");
  647.             } else {
  648.             /* set user password */
  649.             AECryptCpy(User.PassKey,msg->String);
  650.             }
  651.         break;
  652.  
  653.        case  DT_LOCATION      :
  654.              if(msg->Data) strcpy(msg->String,User.Location);
  655.              else sprintf(User.Location,"%.30s",msg->String);
  656.              break;
  657.        case  DT_PHONENUMBER   :
  658.              if(msg->Data) strcpy(msg->String,User.PhoneNumber);
  659.              else sprintf(User.PhoneNumber,"%.13s",msg->String);
  660.              break;
  661.        case  DT_SLOTNUMBER    :
  662.              if(msg->Data) sprintf(msg->String,"%d",User.Slot_Number);
  663.              else User.Slot_Number=atoi(msg->String);
  664.              break;
  665.        case  DT_SECSTATUS     :
  666.              if(msg->Data) sprintf(msg->String,"%d",User.Sec_Status);
  667.              else { User.Sec_Status=atoi(msg->String); ConvertAccess(); }
  668.              break;
  669.        case  DT_SECBOARD      :
  670.              if(msg->Data) sprintf(msg->String,"%d",User.Sec_Board);
  671.              else User.Sec_Board=atoi(msg->String);
  672.              break;
  673.        case  DT_SECLIBRARY    :
  674.              if(msg->Data) sprintf(msg->String,"%d",User.Sec_Library);
  675.              else User.Sec_Library=atoi(msg->String);
  676.              break;
  677.        case  DT_SECBULLETIN   :
  678.              if(msg->Data) sprintf(msg->String,"%d",User.Sec_Bulletin);
  679.              else User.Sec_Bulletin=atoi(msg->String);
  680.              break;
  681.        case  DT_MESSAGESPOSTED:
  682.              if(msg->Data) sprintf(msg->String,"%d",User.Messages_Posted);
  683.              else User.Messages_Posted=atoi(msg->String);
  684.              break;
  685.        case  DT_UPLOADS       :
  686.              if(msg->Data) sprintf(msg->String,"%d",User.Uploads);
  687.              else User.Uploads=atoi(msg->String);
  688.              break;
  689.        case  DT_DOWNLOADS     :
  690.              if(msg->Data) sprintf(msg->String,"%d",User.Downloads);
  691.              else User.Downloads=atoi(msg->String);
  692.              break;
  693.        case  DT_TIMESCALLED   :
  694.              if(msg->Data) sprintf(msg->String,"%d",User.Times_Called);
  695.              else User.Times_Called=atoi(msg->String);
  696.              break;
  697.        case  DT_TIMELASTON    :
  698.              if(msg->Data) sprintf(msg->String,"%d",User.Time_Last_On);
  699.              else User.Time_Last_On=atol(msg->String);
  700.              break;
  701.        case  DT_TIMEUSED      :
  702.              if(msg->Data) sprintf(msg->String,"%d",User.Time_Used);
  703.              else User.Time_Used=atol(msg->String);
  704.              break;
  705.        case  DT_TIMELIMIT     :
  706.              if(msg->Data) sprintf(msg->String,"%d",Time_limit);
  707.              else Time_limit=atol(msg->String);
  708.              break;
  709.        case  DT_TIMETOTAL     :
  710.              if(msg->Data) sprintf(msg->String,"%d",User.Time_Total);
  711.              else User.Time_Total=atol(msg->String);
  712.              break;
  713.        case  DT_BYTESUPLOAD   :
  714.              if(msg->Data) sprintf(msg->String,"%d",User.Bytes_Upload);
  715.              else User.Bytes_Upload=atol(msg->String);
  716.              break;
  717.        case  DT_BYTEDOWNLOAD  :
  718.              if(msg->Data) sprintf(msg->String,"%d",User.Bytes_Download);
  719.              else User.Bytes_Download=atol(msg->String);
  720.              break;
  721.        case  DT_DAILYBYTELIMIT:
  722.              if(msg->Data) sprintf(msg->String,"%d",User.Daily_Bytes_Limit);
  723.              else User.Daily_Bytes_Limit=atol(msg->String);
  724.              break;
  725.        case  DT_DAILYBYTEDLD  :
  726.              if(msg->Data) sprintf(msg->String,"%d",User.Daily_Bytes_Dld);
  727.              else User.Daily_Bytes_Dld=atol(msg->String);
  728.              break;
  729.        case  DT_EXPERT        :
  730.              if(msg->Data) sprintf(msg->String,"%c",User.Expert);
  731.              else User.Expert=msg->String[0];
  732.              break;
  733.        case  DT_LINELENGTH    :
  734.              if(msg->Data) sprintf(msg->String,"%d",User.LineLength);
  735.              else User.LineLength=atoi(msg->String);
  736.              break;
  737.        case  ACTIVE_NODES:
  738.         i=0;
  739.         while(i<32)        // 32 Nodes
  740.             {
  741.             sprintf(GSTR1,"AmiExpress_Node.%d\0",i);
  742.             if(FindPort(GSTR1))
  743.                 {
  744.                 msg->String[i]='X';
  745.                 } else {
  746.                 msg->String[i]=' ';
  747.                 }            
  748.             i++;
  749.             }
  750.         break;
  751.  
  752.       case  DT_DUMP:
  753.             DumpActiveUser(msg->String); break;
  754.       case  DT_MSGCODE:
  755.             switch(msg->Data)
  756.             {
  757.               case 1: doormsgcode=1; break;
  758.               case 2: doormsgcode=0; break;
  759.               default: msg->Data=doormsgcode;
  760.             }break;
  761.       case  ENVSTAT:
  762.             if(msg->Data)
  763.             {
  764.               sprintf(Screen_Address,"%d",UserIsDoing); 
  765.               strcpy(msg->String,Screen_Address);
  766.             }
  767.             else { UserIsDoing=atoi(msg->String);
  768.             SetEnvStat(atoi(msg->String)); } break; 
  769.       case  SV_NEWMSG:
  770.             strcpy(Screen_Address,msg->String);
  771.             SetEnvMsg(Screen_Address); break;
  772.       case  DT_TIMEOUT:
  773.             if(msg->Data) sprintf(msg->String,"%d",DOOR_TIMEOUT);
  774.             else DOOR_TIMEOUT=atol(msg->String);
  775.             break;
  776.       case  BB_CONFNAME:
  777.             if(msg->Data) strcpy(msg->String,Conference_Name);
  778.             else{ strcpy(Conference_Name,msg->String);
  779.                   strcpy(Cmds->ConfName[User.ConfRJoin-1],msg->String); 
  780.                 }
  781.             break;
  782.       case  BB_CONFLOCAL:
  783.             if(msg->Data) strcpy(msg->String,Conference_Location);
  784.             else
  785.             {
  786.                strcpy(Conference_Location,msg->String);
  787.              strcpy(GSTR1,Conference_Location);
  788.              if(MaxDirs=IntFromIcon(GSTR1,"NDIRS")) {
  789.               strcpy(GSTR1,Conference_Location);
  790.               if(IsFromIcon(GSTR1,"FREEDOWNLOADS")) FreeDownloads=1; else FreeDownloads=0;
  791.              }
  792.             }
  793.             break;  
  794.       case  BB_LOCAL:
  795.             strcpy(msg->String,Cmds->BBSLoc); break;
  796.       case  ZMODEMSEND:
  797.             DTBT=0;
  798.             TBT=0;
  799.             TTTM=NULL;
  800.             TTEFF=NULL;
  801.             TTCPS=NULL;
  802.             strcpy(Screen_Address,msg->String);
  803.             ch=Zmodem_Send(Screen_Address);
  804.             if(Whence_The_Logon==REMOTE_LOGON && !CheckCarrier()) msg->Data=-2;
  805.             else
  806.               msg->Data=ch;
  807.              break;
  808.       case  BATCHZMODEMSEND:
  809.             DTBT=0;
  810.             TBT=0;
  811.             TTTM=NULL;
  812.             TTEFF=NULL;
  813.             TTCPS=NULL;
  814.             strcpy(Screen_Address,msg->String);
  815.             ch=Zmodem_Send(msg->Filler1);
  816.             if(Whence_The_Logon==REMOTE_LOGON && !CheckCarrier()) msg->Data=-2;
  817.             else
  818.               msg->Data=ch;
  819.              break;
  820.       case  ZMODEMRECEIVE:
  821.             DTBT=0;
  822.             TBT=0;
  823.             TTTM=NULL;
  824.             TTEFF=NULL;
  825.             TTCPS=NULL;
  826.             strcpy(Screen_Address,msg->String);
  827.             ch=Zmodem_Receive(Screen_Address,1); 
  828.             if(Whence_The_Logon==REMOTE_LOGON && !CheckCarrier()) msg->Data=-2;
  829.             else
  830.               msg->Data=ch;
  831.             break;
  832.       case  SCREEN_ADDRESS:
  833.             sprintf(Screen_Address,"%08x",MYScreen);
  834.             strcpy(msg->String,Screen_Address);
  835.             break; 
  836.  
  837.       case  BB_TASKPRI:
  838.             sprintf(Screen_Address,"%u",Cmds->TaskPri);
  839.             strcpy(msg->String,Screen_Address);
  840.             break;
  841.       case  RAWSCREEN_ADDRESS:
  842.             sprintf(Screen_Address,"%ld",MYScreen);
  843.             strcpy(msg->String,Screen_Address);
  844.             break; 
  845.       case  BB_CHATFLAG:
  846.             if(SySChat) strcpy(msg->String,"ON");
  847.             else strcpy(msg->String,"OFF");
  848.             break;
  849.       case  BB_CHATSET:
  850.             if(msg->Data)
  851.             {
  852.               sprintf(Screen_Address,"%d",PagedFlag);
  853.               strcpy(msg->String,Screen_Address);
  854.             }else PagedFlag=atoi(msg->String);
  855.             break;
  856.       case  DT_STAMP_LASTON:
  857.                   sprintf(string,"%s",ctime(&User.Time_Last_On));
  858.                   string[strlen(string)-1]='\0';
  859.                   strcpy(msg->String,string); break;
  860.        case DT_CURR_TIME:
  861.             TimeVar=time(NULL);
  862.             sprintf(string,"%d",TimeVar);
  863.             strcpy(msg->String,string); break;
  864.        case DT_STAMP_CTIME:
  865.                   TimeVar=0L;
  866.                   Time_system=time(&TimeVar);
  867.             sprintf(string,"%s",ctime(&Time_system));
  868.             string[strlen(string)-1]='\0';
  869.             strcpy(msg->String,string); break;
  870.        case DT_CONFACCESS:
  871.             if(msg->Data) strcpy(msg->String,User.Conference_Access);
  872.             else strcpy(User.Conference_Access,msg->String);
  873.             break;
  874.        case  BB_PCONFNAME:
  875.             temp=atoi(msg->String); 
  876.             if(temp<1 || temp>9)
  877.             {
  878.               strcpy(msg->String,"ERROR"); break;
  879.             }
  880.             strcpy(msg->String,Cmds->ConfName[temp-1]);
  881.             break;
  882.        case BB_PCONFLOCAL:
  883.             temp=atoi(msg->String);
  884.             if(temp<1 || temp>9)
  885.             {
  886.               strcpy(msg->String,"ERROR"); break;
  887.             }
  888.             strcpy(msg->String,Cmds->ConfLoc[temp-1]);
  889.             break;
  890.        case BB_MAINLINE:
  891.             ServerCommand[195]='\0';
  892.             strcpy(msg->String,ServerCommand); break; 
  893.        case BB_NODEID:
  894.             sprintf(Screen_Address,"%d",Cmds->AcLvl[LVL_NODE_NUMBER]);
  895.             strcpy(msg->String,Screen_Address); break;
  896.        case BB_CALLERSLOG:
  897.             CallersLog(msg->String); break;
  898.        case BB_UDLOG:
  899.             UDLog(msg->String); break;
  900.        case EXPRESS_VERSION:
  901.             strcpy(msg->String,MyVerStr); break;
  902.        case GETKEY:
  903.             if(CheckSer() || CheckCon())
  904.             msg->String[0]='1'; else msg->String[0]='0';
  905.             msg->String[1]='\0';
  906.             break;
  907.        case RAWARROW:
  908.             if(RawArrow) RawArrow=0; else RawArrow=1;
  909.             break;
  910.        case PRV_COMMAND:
  911.             strcpy(ServerCommand,msg->String);
  912.             MenuCommand(ServerCommand);
  913.             break;
  914.        case PRV_GROUP:
  915.             strcpy(ServerCommand,msg->String);
  916.             temp=atoi(ServerCommand);
  917.             strcpy(Cmds->ConfLoc[temp],&ServerCommand[40]);
  918.             if(temp==CN-1) strcpy(Conference_Location,&ServerCommand[40]);
  919.             ServerCommand[39]='\0';
  920.             StripReturn(ServerCommand);
  921.             strcpy(Cmds->ConfName[temp],&ServerCommand[2]);
  922.             if(temp==CN-1) strcpy(Conference_Name,&ServerCommand[2]);
  923.             break;
  924.        case BB_CONFNUM:
  925.             sprintf(ServerCommand,"%d",CN-1);
  926.             strcpy(msg->String,ServerCommand);
  927.             break;
  928.        case BB_DROPDTR:
  929.             ModemOffHook(); break;
  930.        case BB_GETTASK:
  931.             msg->task=(struct Process *)FindTask(0L);
  932.             break;
  933.        case NODE_BAUD:
  934.             sprintf(Screen_Address,"%ld",Online_Baud);
  935.             strcpy(msg->String,Screen_Address);break;
  936.        case NODE_BAUDRATE:
  937.             sprintf(Screen_Address,"%ld",Online_BaudR);
  938.             strcpy(msg->String,Screen_Address);break;
  939.        case NODE_DEVICE:
  940.             strcpy(msg->String,Cmds->SerDev); break;
  941.        case NODE_UNIT:
  942.             sprintf(Screen_Address,"%d",Cmds->SerDevUnit);
  943.             strcpy(msg->String,Screen_Address);
  944.             break;
  945.        case DT_ADDBIT:
  946.             ADD_BIT(msg->Data); break;
  947.        case DT_REMBIT:
  948.             REM_BIT(msg->Data); break;
  949.        case DT_QUERYBIT:
  950.             msg->Command=GET_BIT(msg->Data); break;
  951.        case BB_LOGONTYPE:
  952.              msg->Data=Whence_The_Logon;
  953.             break;
  954.        case BB_SCRLEFT: msg->Data=MYNewScreen.LeftEdge; break;
  955.        case BB_SCRTOP: msg->Data=MYNewScreen.TopEdge; break;
  956.        case BB_SCRWIDTH: msg->Data=MYNewScreen.Width; break;
  957.        case BB_SCRHEIGHT: msg->Data=MYNewScreen.Height; break;
  958.        case BB_PURGELINE: PurgeLine(); break;
  959.        case BB_PURGELINESTART: PurgeLineStart(); break;
  960.        case BB_PURGELINEEND: PurgeLineEnd(); break;
  961.        case BB_NONSTOPTEXT: if(!msg->Data) gnsflag=0; else gnsflag=1;
  962.             break;
  963.        case BB_LINECOUNT: if(!msg->Data) LineCount=atoi(msg->String);
  964.             else { sprintf(Screen_Address,"%d",LineCount); strcpy(msg->String,Screen_Address); }
  965.             break;
  966.        case DT_LANGUAGE: if(msg->Data) strcpy(msg->String,lang); else
  967.             strcpy(lang,msg->String); break; 
  968.        case DT_QUICKFLAG:
  969.             QuickFlag=msg->Data;
  970.             break;
  971.        case DT_GOODFILE:
  972.             AEGoodFile=msg->Data; break;
  973.        case DT_ANSICOLOR:
  974.              if(msg->Data) { AnsiColor=1;  }
  975.              else { AnsiColor=0;  }
  976.              break;
  977.        case DT_ISANSI:
  978.             if(AnsiColor) msg->Data=1;
  979.             else msg->Data=0; break;
  980.        case MULTICOM:
  981.             msg->Semi=(APTR)MasterNode;
  982.             break;
  983.        case LOAD_ACCOUNT:
  984.             tempuserdata=msg->Filler1; tempuserkeys=msg->Filler2;
  985.             msg->NodeID=0;
  986.             if(User.Slot_Number==msg->Data)
  987.               {
  988.                 SaveMsgPointers(CN); //AddMsgPointers(); 
  989.                 CopyMem((struct User *)&User,tempuserdata,sizeof(struct User));
  990.                 CopyMem((struct UserKeys *)&User_keys,tempuserkeys,sizeof(struct UserKeys));
  991.                 LoadMsgPointers(CN);
  992.                 msg->NodeID=1; 
  993.               }
  994.               else
  995.              {
  996.             if(Load_Account(msg->Data,msg->Filler1,msg->Filler2)!=FAILURE) msg->NodeID=1;  
  997.             }
  998.             msg->Data=msg->NodeID;
  999.             break;
  1000.        case SEARCH_ACCOUNT:
  1001.             if(Find_User_From_Number(msg->Data,msg->Filler1)) msg->Data=1; else
  1002.             msg->Data=0;
  1003.             break;
  1004.        case APPEND_ACCOUNT:
  1005.             tempuserdata=(struct User *)msg->Filler1;
  1006.             tempuserkeys=(struct UserKeys *)msg->Filler2;
  1007.             InitUser(tempuserdata,tempuserkeys);
  1008.             Find_Open_Account(tempuserdata,tempuserkeys);
  1009.             break;
  1010.        case LAST_ACCOUNTNUM:
  1011.             msg->Data=(int) Find_Last_Account();
  1012.             break;
  1013.        
  1014.        case SAVE_ACCOUNT:
  1015.             tempuserdata=(struct User *)msg->Filler1;
  1016.             tempuserkeys=(struct UserKeys *)msg->Filler2;
  1017.             if(tempuserdata->Slot_Number==0)
  1018.             {
  1019.               tempuserkeys->Number=0;
  1020.               Save_Account(tempuserdata,tempuserkeys,msg->Data,1);
  1021.             }
  1022.             else
  1023.  
  1024.             Save_Account(tempuserdata,tempuserkeys,0,0);
  1025.  
  1026.             if(User.Slot_Number==msg->Data)
  1027.             {
  1028.              i=0; 
  1029.              if(User.Sec_Status!=tempuserdata->Sec_Status || !stricmp(User.Conference_Access,tempuserdata->Conference_Access)) i=1;
  1030.              CopyMem(tempuserdata,(struct User *)&User,sizeof(struct User));
  1031.              CopyMem(tempuserkeys,(struct UserKeys *)&User_keys,sizeof(struct UserKeys));
  1032.              Time_limit=User.Time_Total-User.Time_Used;
  1033.              LoadMsgPointers(CN);
  1034.              if(i) ConvertAccess();
  1035.               
  1036.             }
  1037.  
  1038.             break;
  1039.        case EDITOR_STRUCT:
  1040.             if(msg->Data)
  1041.             {
  1042.                CopyMem(msg->Filler1,(APTR)&EditorStruct,sizeof(struct MyEditor));
  1043.             }else CopyMem((APTR)&EditorStruct,msg->Filler1,sizeof(struct MyEditor));
  1044.             break;
  1045.        case LOAD_CONFDB:
  1046.  
  1047.             Load_ConfDB(msg->Data,msg->NodeID,msg->Filler1);
  1048.             tempconfdb=msg->Filler1;
  1049.             break;
  1050.        case SAVE_CONFDB:
  1051.             tempconfdb=msg->Filler1;
  1052.          Save_ConfDB(msg->Data,msg->NodeID,msg->Filler1);
  1053.      if(User.Slot_Number==msg->Data) LoadMsgPointers(CN);
  1054.        
  1055.             break;
  1056.        case GET_CONFNUM:
  1057.             GetConfName((char *)msg->Filler1,(char *)msg->Filler2,msg->Data);
  1058.             GetConfName(GSTR1,GSTR2,CN-1);  break;
  1059.        case MOD_TYPE: msg->Data=ModType; break;
  1060.        case DT_FILECODE: checksym=msg->Data; break;
  1061.        case ACP_COMMAND:
  1062.             SendACPCommand(msg->String,msg->Data,msg->LineNum);
  1063.             break;
  1064.        case BYPASS_CSI_CHECK:
  1065.             BypassCSI=msg->Data; break;
  1066.        case SENTBY:
  1067.             msg->Data=Cmds->AcLvl[20]; break;
  1068.  
  1069.  
  1070.     }
  1071.     ReplyMsg((struct Message *)msg);
  1072.   }
  1073. }
  1074. else
  1075. while(1)
  1076. {
  1077.   doormsg=(struct DoorMsg *)WaitPort((struct MsgPort *)mp);
  1078.   while(doormsg=(struct DoorMsg *)GetMsg((struct MsgPort *)mp))
  1079.   {
  1080.     doormsg->carrier=FALSE;
  1081.     switch(doormsg->command)
  1082.     {
  1083.        case PG_SHUTDOWN:
  1084.              strcpy(string,"Exiting");
  1085.                 ReplyMsg((struct Message *)doormsg);
  1086.                 DeletePort((struct MsgPort *)mp);
  1087.                 AEPutStr("\r\n"); RawArrow=0;return(0);
  1088.              break;
  1089.        case  PG_SO: SerPutChar((char *)&(doormsg->data)); break;
  1090.        case  PG_CC: ConPutChar((char *)&(doormsg->data)); break;
  1091.        case  PG_CH: SerPutChar((char *)&(doormsg->data)); 
  1092.                     ConPutChar((char *)&(doormsg->data));break;
  1093.        case  PG_CO:
  1094.              ConPutStr(doormsg->string); if(doormsg->data){ ConPutStr("\r\n");
  1095. CheckForPause(); }break;
  1096.        case  PG_SM:
  1097.              AEPutStr(doormsg->string);if(doormsg->data){ AEPutStr("\r\n");
  1098. CheckForPause();} break;
  1099.        case  PG_PM:AEPutStr(doormsg->string);
  1100.              if(LineInput("",doormsg->string,doormsg->data,DOOR_TIMEOUT)<0)
  1101.              doormsg->carrier=TRUE; else doormsg->carrier=FALSE;break;
  1102.         case  PG_SC:AEPutStr(doormsg->string);
  1103.              if(LineInput("",doormsg->string,doormsg->data,DOOR_TIMEOUT)<0)
  1104.              doormsg->carrier=TRUE; else doormsg->carrier=FALSE;break;
  1105.        case  PG_HK:
  1106.              ch=HtKey(doormsg->string);  if(ch<0)doormsg->carrier=TRUE;else doormsg->carrier=FALSE;
  1107.              doormsg->string[0]=ch; doormsg->string[1]='\0'; break;
  1108.        case  PG_SG:gnsflag=0;MCIViewSafe=FALSE;
  1109.              SG(doormsg->string); MCIViewSafe=TRUE;break;
  1110.        case  PG_SF:gnsflag=0;
  1111.              MCIViewSafe=FALSE;SF(doormsg->string);MCIViewSafe=TRUE; break;
  1112.        case  PG_EF:
  1113.              EF(doormsg->string,75,doormsg->data); break;
  1114.        case  PG_UD:
  1115.                if(doormsg->data==1){ doormsg->data=User.Sec_Status/10; break; }
  1116.                if(doormsg->data==2){ doormsg->data=User.Expert; break; }
  1117.                if(doormsg->data==3){ doormsg->data=0; break; }
  1118.                if(doormsg->data==4){ doormsg->data=User.Times_Called; break;}
  1119.                if(doormsg->data==5){ doormsg->data=User.Times_Called; break;}
  1120.                if(doormsg->data==6){ doormsg->data=1; break;}
  1121.                if(doormsg->data==7){ doormsg->data=(int)(Time_limit/60L); break; }
  1122.                if(doormsg->data==8){ doormsg->data=80; break; }
  1123.                if(doormsg->data==9){ doormsg->data=User.LineLength; break; }
  1124.                break;
  1125.        case  PG_US:
  1126.                if(doormsg->data==1){ strcpy(doormsg->string,User.Name);doormsg->string[21]='\0'; break;}
  1127.                if(doormsg->data==2){ strcpy(doormsg->string,User.Pass);doormsg->string[13]='\0'; break;}
  1128.                if(doormsg->data==3){ strcpy(doormsg->string,User.Location);doormsg->string[39]='\0'; break; }
  1129.                if(doormsg->data==4){ strcpy(doormsg->string,User.Location);doormsg->string[29]='\0'; break; }
  1130.                if(doormsg->data==5){ strcpy(doormsg->string,User.Location);doormsg->string[2]='\0'; break; }
  1131.                if(doormsg->data==6){ strcpy(doormsg->string,User.Location);doormsg->string[7]='\0'; break; }
  1132.                if(doormsg->data==7){ strcpy(doormsg->string,"PGDOORS:"); break;}
  1133.                if(doormsg->data==8){ strcpy(doormsg->string,Cmds->BBSLoc); break;}
  1134.                 
  1135.                if(doormsg->data==9){ strcpy(doormsg->string,GetTheDate(0L)); break;}
  1136.                if(doormsg->data==10)
  1137.                
  1138.                {
  1139.                   Time_system=time(NULL);
  1140.                   sprintf(string,"%s",ctime(&Time_system));
  1141.                   Convert_CTime_To_Date(string,date,DISPLAY_time);
  1142.                   strcpy(doormsg->string,DISPLAY_time); break;
  1143.                }
  1144.               strcpy(doormsg->string,""); break;
  1145.        case PG_PS: break;
  1146.        case PG_CS: break;
  1147.        case PG_RD: if(doormsg->data==0) break; else doormsg->data=rnd(doormsg->data); break;
  1148.        case PG_CL: break;
  1149.        case PG_TM: User.Time_Used -=((LONG)doormsg->data)*60L; 
  1150.                    if(User.Time_Used<0L)User.Time_Used=0L;
  1151.                    Time_limit +=((LONG)doormsg->data)*60L;
  1152.                    if(Time_limit<0L) Time_limit=0L;
  1153.                    break;
  1154.        case PG_FF: if(!access(doormsg->string,00)) doormsg->data=1; else
  1155.        doormsg->data=-1; break;
  1156.          case  BB_TASKPRI:
  1157.             sprintf(Screen_Address,"%u",Cmds->TaskPri);
  1158.             strcpy(msg->String,Screen_Address);
  1159.             break;
  1160.    
  1161.      }   
  1162.     ReplyMsg((struct Message *)doormsg);
  1163.   }
  1164. }
  1165.   RawArrow=0;
  1166. }
  1167.  
  1168.  
  1169.  
  1170. /* showfile(mstring) shows the text file which mstring is the path to.
  1171. */
  1172. void showfile(mstring)
  1173. char mstring[];
  1174. {      
  1175.         if(!access(mstring,00))
  1176.         {
  1177.           DisplayFile(mstring);
  1178.         }
  1179. }
  1180. void showgfile(mstring)
  1181. char mstring[];
  1182. {
  1183.   char FileName[80];
  1184.   strcpy(FileName,mstring);
  1185.   strcat(FileName,".GR1");
  1186.  
  1187.         if(!access(FileName,00))
  1188.         {
  1189.           DisplayFile(FileName);
  1190.         }
  1191.         else 
  1192.         {
  1193.           strcpy(FileName,mstring);
  1194.           strcat(FileName,".TXT.GR");
  1195.           if(!access(FileName,00))
  1196.           {
  1197.             DisplayFile(FileName);
  1198.           }
  1199.           else
  1200.           {
  1201.             strcpy(FileName,mstring);
  1202.             strcat(FileName,".TXT");
  1203.             if(!access(FileName,00))
  1204.             {
  1205.               DisplayFile(FileName);
  1206.             }
  1207.           }
  1208.         }
  1209. }
  1210. extern int Lines;
  1211. int EditFile(char mstring[],int End,int Length)
  1212. {
  1213.   FILE *fi;
  1214.   int stat;
  1215.   Lines=0;
  1216.   LoadMsg(mstring);
  1217.   stat=Edit();
  1218.   if(stat==TIMEOUT||stat==NO_CARRIER) return(0);
  1219.   if(stat<0) { AEPutStr("\r\n"); return(1); }
  1220.   AEPutStr("Saving...");
  1221.   if(!(fi=fopen(mstring,"w")))
  1222.   {
  1223.     AEPutStr("Failed!\r\n\r\n");
  1224.     return(1);
  1225.   }
  1226.   for(stat=0;stat<Lines;stat++)
  1227.     fprintf(fi,"%s\n",MsgBuf[stat]);
  1228.    fclose(fi);
  1229.   return(1);
  1230. }
  1231. int HtKey(char *prompt)
  1232. {
  1233. int ch;
  1234. LineCount=0;
  1235. AEPutStr(prompt);
  1236.     ch=(int)ReadChar(DOOR_TIMEOUT);
  1237.        /* if(isparagon==TRUE)*/ return(ch);
  1238.     /*if(ch=='\r' || ch=='\n') ch='\0'; return(ch);*/
  1239. VOID DumpActiveUser(char *FileName)
  1240. {
  1241.   FILE *fi;
  1242.   fi=fopen(FileName,"wb");
  1243.   fwrite((APTR)&User,sizeof(struct User),1,fi);
  1244.   fclose(fi);
  1245. }
  1246.  
  1247. int DisplayFile(char *s)
  1248. {
  1249.   int result;
  1250.   MCIDoor=TRUE;
  1251.   result=MenuSend24(s,0);MCIDoor=FALSE;
  1252.   return(result);
  1253.  
  1254. }
  1255. void CheckRexxInterface(char *arg1,char *returnstr)
  1256. {
  1257.    static BOOL Inac=FALSE;
  1258.    int Command;
  1259.    strcpy(returnstr,"BUSY");
  1260.    if(Inac) return;
  1261.    strcpy(returnstr,"");
  1262.    //if(*(arg1)!=0) Command=atoi(arg1);
  1263.    if(!strnicmp(arg1,"GETDATA",7))
  1264.    {
  1265.      Command=atoi(arg1+8);
  1266.      switch(Command)
  1267.      {
  1268.       case  BB_CHATFLAG:
  1269.             if(SySChat) strcpy(returnstr,"ON");
  1270.             else strcpy(returnstr,"OFF");
  1271.             break;
  1272.    
  1273.      }
  1274.      return;
  1275.     }
  1276.   
  1277.     if(!strnicmp(arg1,"AESAYLN",7))
  1278.     {
  1279.        Inac=TRUE;
  1280.        AEPutStr(arg1+8);
  1281.        AEPutStr("\r\n");
  1282.        Inac=FALSE;
  1283.        return;
  1284.     }
  1285.     if(!strnicmp(arg1,"AESAY",5))
  1286.     {
  1287.        Inac=TRUE;
  1288.        AEPutStr(arg1+6);
  1289.        Inac=FALSE;
  1290.        return;
  1291.     }
  1292.    
  1293. }
  1294.  
  1295.